package com.leehongrim.tools.pdf;

import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Slf4j
public class PDFUtils {

    /**
     * PDF转图片核心方法
     * @param pdfFile PDF文件路径
     * @param outputDir 图片输出目录
     * @param imageFormat 图片格式
     * @param dpi 图片分辨率
     */
    public static List<File> convertPdfToImages(File pdfFile, String outputDir,
                                                String imageFormat, int dpi,
                                                int maxPage) throws IOException {
        List<File> result = new ArrayList<>();
        // 加载PDF文档
        if (!pdfFile.exists()) {
            throw new IOException("PDF文件不存在：" + pdfFile.getAbsolutePath());
        }

        try (PDDocument document = PDDocument.load(pdfFile)) {
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            File outDir = new File(outputDir);

            // 自动创建输出目录
            if (!outDir.exists()) {
                outDir.mkdirs();
            }

            // 遍历PDF每一页并转换
            int pageCount = document.getNumberOfPages();
            // 限制最大页码
            if(maxPage > 0 && pageCount > maxPage) {
                pageCount = maxPage;
                log.warn("限制最大数量{}", maxPage);
            }
            for (int pageIndex = 0; pageIndex < pageCount; pageIndex++) {
                // 渲染页面为图片，指定DPI和图像类型（RGB避免透明问题）
                BufferedImage image = pdfRenderer.renderImageWithDPI(
                        pageIndex, dpi, ImageType.RGB
                );

                // 生成图片文件名（如page_1.png）
                String imageName = "page_" + (pageIndex + 1) + "." + imageFormat;
                File outputImage = new File(outDir, imageName);

                // 保存图片
                if (!ImageIO.write(image, imageFormat, outputImage)) {
                    throw new IOException("不支持的图片格式：" + imageFormat);
                }
                log.info("已生成：" + outputImage.getAbsolutePath());
                result.add(outputImage);
            }
        }

        return result;
    }
}
